Soru & Cevap

Androidde FTPden dosya indirme kodlarında hata nerde?

24.02.2015 - 08:24

Merhaba ben ftpden dosya indirmek istiyorum ama bir türlü yapamadım. bir sürü hata veriyor. hatalarım nedir nasıl çözerim cevap verirseniz çok sevineceğim.

hata

Görsel kaldırıldı.

1-eclipsede androidprojesi oluşturdum

2-internet,telefon durumu ve sdkart yazma izinlerini manifeste ekledim.

3-apache commons-net kütüphanesini projede lib klasörüne kopyaladım. ve user lib ekledim

Görsel kaldırıldı.

ve tüm kodda böyle

[code]

package com.example.deneme10;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.BufferedOutputStream;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.view.Menu;
import android.view.MenuItem;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;

public class MainActivity extends Activity {
    private ProgressDialog dialog=new ProgressDialog(MainActivity.this);
    
    
    
    public class BackgroundTask extends AsyncTask<Void, Void, Void> {
        
          @Override
          protected void onPreExecute() {
             super.onPreExecute();
             dialog.setMessage("Yükleniyor");
             dialog.show();
          }
    
          @Override
          protected Void doInBackground(Void... params) {
              
              
              String server = "site adresim";
              int port = 21;
              String user = "kullanıcı adım";
              String pass = "şifrem";
       
              FTPClient ftpClient = new FTPClient();
              try {
       
                  ftpClient.connect(server, port);
                  ftpClient.login(user, pass);
                  ftpClient.enterLocalPassiveMode();
                  ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
       
                  // APPROACH #1: using retrieveFile(String, OutputStream)
                  String yol = Environment.getExternalStorageDirectory().toString();
                  String remoteFile1 = "/video.mp4";
                  File downloadFile1 = new File(yol+"/video.mp4");
                  OutputStream outputStream1 = new BufferedOutputStream(new FileOutputStream(downloadFile1));
                  boolean success = ftpClient.retrieveFile(remoteFile1, outputStream1);
                  outputStream1.close();
       
                  if (success) {
                      System.out.println("File #1 has been downloaded successfully.");
                  }
       
                  // APPROACH #2: using InputStream retrieveFileStream(String)
                  String yol2 = Environment.getExternalStorageDirectory().toString();
                  String remoteFile2 = "/sarki.mp3";
                  File downloadFile2 = new File(yol2+"/sarki.mp3");
                  OutputStream outputStream2 = new BufferedOutputStream(new FileOutputStream(downloadFile2));
                  InputStream inputStream = ftpClient.retrieveFileStream(remoteFile2);
                  byte[] bytesArray = new byte[4096];
                  int bytesRead = -1;
                  while ((bytesRead = inputStream.read(bytesArray)) != -1) {
                      outputStream2.write(bytesArray, 0, bytesRead);
                  }
       
                  success = ftpClient.completePendingCommand();
                  if (success) {
                      System.out.println("File #2 has been downloaded successfully.");
                  }
                  outputStream2.close();
                  inputStream.close();
       
              } catch (IOException ex) {
                  System.out.println("Error: " + ex.getMessage());
                  ex.printStackTrace();
              } finally {
                  try {
                      if (ftpClient.isConnected()) {
                          ftpClient.logout();
                          ftpClient.disconnect();
                      }
                  } catch (IOException ex) {
                      ex.printStackTrace();
                  }
              }
          
              
             return null;
          }
    
          @Override
          protected void onPostExecute(Void result) {
             super.onPostExecute(result);
             dialog.dismiss();
          }
    
          @Override
          protected void onProgressUpdate(Void... values) {
             super.onProgressUpdate(values);
          }
    
          @Override
          protected void onCancelled(Void result) {
             super.onCancelled(result);
          }
    
       }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new BackgroundTask().execute();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

 

[/code]

 

 

66 Görüntülenme

2 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

picture-20496-1400501549.jpg
emr3karatas
26.02.2015 - 11:52

FTP için illa commons kullanman gerekmez. Başka jar lar da var. Eğer kendin yazarsan başkalarının jarlarına ihtiyaç duymazsın. Fakat commons, apache nin jar ı, başkalarına bilgilerini emanet etmektense apacheye etmen daha güvenli. Ama yine de kritik bilgiler varsa oturup kendin yazacaksın :) Yazana kadar commons la devam.

 

İndirme kodları aşağıdaki gibi,

 

 

[code]@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new Thread(new Runnable() {
            OutputStream fileStok;
            OutputStream fileMevcut;

            public void run() {

                try {
                    
                    fileStok = new FileOutputStream("sdcard/StokCari.sqlite");
                  
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
               
                downloadFile(fileStok);
            }
        }).start();

    }

 

 

       

public void downloadFile(OutputStream fileStok) {

        FTPClient client = new FTPClient();

        String LastFileName = null;

        try {
            client.connect(FTP_HOST, 21);
            client.login(FTP_USER, FTP_PASS);
            client.setFileType(FTPClient.BINARY_FILE_TYPE);

            client.changeWorkingDirectory("/sqlite/");
            FTPFile[] arr = client.listFiles();
            for (FTPFile p : arr) {

              
                LastFileName = p.getName();

            }
            
            client.changeWorkingDirectory("/sqlite/" + LastFileName);

            FTPFile[] SonKlasor = client.listFiles();

            for (FTPFile stokcari : SonKlasor) {
                boolean stok = stokcari.getName().trim().matches("StokCari_.*");
                       
                if (stok) {
                  
                    Stokk = stokcari.getName();
                }
             
            }

            client.retrieveFile(Stokk, fileStok);
        

        } catch (Exception e) {
            e.printStackTrace();
            try {
                client.disconnect();
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }

picture-20496-1400501549.jpg
emr3karatas
26.02.2015 - 11:10

Nullpointer diyor en başta. Bu demek oluyor ki bi veri var ortada gönderme yada alma işini yapan. O veri boş dönüyor diyo. Dışardan gelen veri yani indirmeye çalıştıgın veriyi nereye atadıysan onu logla. Bak bakalım dışardan gelen veriyi log da görebilcen mi. Daha sonra dolu geliyorsa o veriyi indirme işleminin olduğu yere ver orda logla bak bakalım doğru değer dönüyor mu. Kısacası asyntask olmak üzere en baştan Logla " Log.e("Deneme: ","0") 0,1,2,3 diye. Bak bakalım nerelere giriyor program nerelere girmiyor. Tanımladığın değerleri de logla bak bakalım neler boş geliyor neler dolu geliyor. Bu şekilde hatanın nerede olduğunu tespit edebilirsin.

 

yakup
26.02.2015 - 10:19
kopyala yapıştır kod yazmanın zararları :) hatayı buldum. aşşağıdaki yeri silince program çalıştı. kaç gündür uğraşıyordum. try { if (ftpClient.isConnected()) { ftpClient.logout(); ftpClient.disconnect(); } } catch (IOException ex) { ex.printStackTrace(); } }